package web.java.daoImpl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import web.java.dao.*;

public class BaseDaoImpl implements BaseDao{
	//初始化参数
	private Connection conn;
	private PreparedStatement pstmt;
	private ResultSet result;

	@Override
	public <T> List<T> select(Object[] params, Class<T> clazz) {
		ComboPooledDataSource dataSource=new ComboPooledDataSource();
		try{
			//1、建立连接
			conn=dataSource.getConnection();
			//2、执行sql语句
			String sql="select * from emp";
			pstmt=conn.prepareStatement(sql);
			//获取参数个数
			int count=pstmt.getParameterMetaData().getParameterCount();
			//若参数个数为0，直接得到结果集，若参数不为零，先设置参数，再执行sql语句
			if(params!=null && count>0){
				//设置参数
				for(int i=0;i<params.length;i++){
					pstmt.setObject(i+1,params[i]);
				}
			}
			//执行sql语句，得到结果集
			result=pstmt.executeQuery();
			//3、获得结果集元数据
			ResultSetMetaData rsMetaData=pstmt.getMetaData();
			//3.1 获取结果集列的个数
			int columnCount=rsMetaData.getColumnCount();
			//4、迭代将结果集数据封装到集合中
			List<T> list=new ArrayList<T>();
			while(result.next()){
				//4.1 得到每一列的值
				T t=clazz.newInstance();
				for(int i=0;i<columnCount;i++){
					//4.1_a 得到每一列的名称，列名从1开始
					String columnName=rsMetaData.getColumnName(i+1);
					//4.1_b 通过列名，得到每一列的值
					Object columnValue=result.getObject(columnName);
					//4.2_b 将每一列的值，封装到对象中
					BeanUtils.copyProperty(t, columnName, columnValue);
				}
				//4.2 封装对象到集合中
				list.add(t);
			}
			//5、返回集合
			return list;
		}catch(Exception e){
			throw new RuntimeException(e);
		}finally{
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
